#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/async.h>
#include <iostream>
#include "logger.h"
#include "network_module.h"
#include "database_module.h"

// 声明示例模块函数
void example_module_function();
void example_module_function_with_spdlog();

// 声明ctest函数
extern "C" int ctest();

// 声明multi_sink_example函数
void multi_sink_example();

/**
 * @brief 演示spdlog的基本用法
 * 
 * 本示例展示了spdlog库的各种功能，包括：
 * - 不同级别的日志记录
 * - 控制台彩色输出
 * - 文件日志记录
 * - 异步日志记录
 */
void basic_logging_demo() {
    // 基本日志记录
    spdlog::info("Welcome to spdlog version {}.{}.{} !", SPDLOG_VER_MAJOR, SPDLOG_VER_MINOR, SPDLOG_VER_PATCH);
    spdlog::warn("Easy padding in numbers like {:08d}", 12);
    spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
    spdlog::info("Support for floats {:03.2f}", 1.23456);
    spdlog::info("Positional args are {1} {0}..", "too", "supported");
    spdlog::info("{:<30}", "left aligned");
}

/**
 * @brief 演示控制台彩色日志输出
 */
void console_logging_demo() {
    // 创建控制台logger（带颜色）
    auto console = spdlog::stdout_color_mt("console");
    console->info("Welcome to spdlog!");
    console->error("Some error message with arg: {}", 1);
    
    // 格式化日志
    console->warn("Easy padding in numbers like {:08d}", 12);
    console->critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
    console->info("Support for floats {:03.2f}", 1.23456);
}

/**
 * @brief 演示文件日志记录
 */
void file_logging_demo() {
    try {
        // 创建基本文件logger
        auto file_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic-log.txt");
        file_logger->info("Welcome to spdlog!");
        file_logger->info("Some info message with arg: {}", 1);
        
        // 创建文件logger（带轮转）
        auto rotating_logger = spdlog::rotating_logger_mt("rotating_logger", "logs/rotating-log.txt", 
                                                         1024 * 1024, 5);
        rotating_logger->info("Rotating logger example");
        
        // 确保日志被写入文件
        spdlog::flush_every(std::chrono::seconds(3));
    } catch (const spdlog::spdlog_ex &ex) {
        std::cout << "Log initialization failed: " << ex.what() << std::endl;
    }
}

/**
 * @brief 演示异步日志记录
 */
void async_logging_demo() {
    // 创建异步logger
    spdlog::init_thread_pool(8192, 1); // 队列大小为8192，1个后台线程
    auto async_file = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async-log.txt");
    
    for (int i = 1; i < 101; ++i) {
        async_file->info("Async message #{}", i);
    }
    
    // 等待异步日志完成
    spdlog::drop("async_file_logger");
}

/**
 * @brief 主函数
 * 
 * @return int 退出状态码
 */

int main() {
    try {
        // 创建带标记的Logger实例
        auto mainLogger = multi_sink::Logger::createLogger("MAIN");
        
        // 在不同文件中使用不同的日志标记
        mainLogger->info("这是主文件中的信息日志");
        mainLogger->warn("这是主文件中的警告日志");
        mainLogger->error("这是主文件中的错误日志");
        
        // 模拟在其他文件中使用不同的标记
        network_module_example();
        database_module_example();
        
        // 使用示例模块
        example_module_function();
        example_module_function_with_spdlog();
        
        // 释放多sink日志记录器资源
        mainLogger->destroy();
        
        // 基本日志记录示例
        basic_logging_demo();
        
        // 控制台日志示例
        console_logging_demo();
        
        // 文件日志示例
        file_logging_demo();
        
        // 异步日志示例
        async_logging_demo();
        
        // 等待异步日志完成
        spdlog::shutdown();
        
        std::cout << "Demo completed successfully!" << std::endl;
    } catch (const std::exception &ex) {
        std::cerr << "Exception caught: " << ex.what() << std::endl;
        return -1;
    }
    
    return 0;
}